// 真实项目中为了保证js的堆栈内存的性能优化，应该尽可能减少闭包使用

// 闭包1：柯理化函数
/*
fn()执行返回私有堆内存地址，恰好被外部变量f所占用，此时fn不销毁。fn里面的变量也就被保存了
*/
function fn() {
    return function () {

    }
}
var f = fn()

// 闭包2 惰性函数。
/*
自执行函数返回值被外部utils变量占用，所以自执行函数形成的私有作用域也被保存。
 */
var utils = (function () {
    return {

    }
})()
    // 闭包2大作用 闭包保护私有变量不受外界干扰（允许同名变量），避免全局变量污染
    (function () {
        var n = 12
        function fn() {

        }
    })()

// 闭包保存作用，形成不销毁的栈内存，把一些变量保存下来，方便后面的调取使用。

// 外界访问不到n fn()
(function () {
    var n = 12
    function jQurey() {
        console.log('aaaa')
    }
   
    // 把需要暴露的方法fn挂载到全局window上。给window加jquery属性值指向堆地址。
    // window.jQurey=window.$=jQurey //函数堆地址
})()

var zepto=(function(){
    // 私有变量外界访问不到
    var n=13
    // 向外暴露return 外面用zepto接收
    return {
        $:function(){
            console.log('aaaa')
        }
    }
})()
console.log(zepto)



function fun(n,o){
    console.log(o)
    return {
        fun :function (m){
            return fun(m,n)
        }
    }
}
var a=fun(0) //undefined
a.fun(1) //0
a.fun(2)//0
a.fun(3)//0

var b=fun(0)
.fun(1) //0
.fun(2)  //1
.fun(3) //2

var c=fun(0).fun(1) // undefined 0
c.fun(2) //1
c.fun(3) //1